package io.gitee.chearnee.fw.datasecurity.core.handler;


import io.gitee.chearnee.fw.datasecurity.core.properties.DataSecurityDbCryptProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.function.UnaryOperator;

/**
 * @author kam
 * @since 2021/4/8
 *
 * <p>
 * 抽像的加解密字段值处理器
 * </p>
 */
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public abstract class AbstractCodecFiledValueHandler implements CodecFieldValueHandler {

    private DataSecurityDbCryptProperty dbCryptProperty;


    @Override
    public String encrypt(String sSrc) {
        if (sSrc.startsWith(dbCryptProperty.getEncryptPrefix())) {
            return sSrc;
        }
        return isEnable() ? doEncrypt(dbCryptProperty.getEncryptPrefix(), sSrc) : sSrc;
    }

    /**
     * 加密实现
     *
     * @param sSrc 加密前字符串
     * @return 加密后结果
     */
    protected abstract String doEncrypt(String sSrc, UnaryOperator<String> encryptSuccess);

    protected String doEncrypt(String prefix, String sSrc) {
        return doEncrypt(sSrc, result -> prefix + result);
    }

    @Override
    public String decrypt(String sSrc) {
        if (!sSrc.startsWith(dbCryptProperty.getEncryptPrefix())) {
            return sSrc;
        }
        sSrc = sSrc.replace(dbCryptProperty.getEncryptPrefix(), "");
        return isEnable() ? doDecrypt(sSrc) : sSrc;
    }
    /**
     * 解密实现
     *
     * @param sSrc 解密前字符串
     * @return 解密后结果
     */
    protected abstract String doDecrypt(String sSrc);


    private boolean isEnable() {
        return this.dbCryptProperty.isEnabled();
    }

}
